package com.Spring.DAO;

import com.Spring.DAO.exceptions.NonexistentEntityException;
import com.Spring.Model.Inscripcion;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;


public class InscripcionDAO implements Serializable {
	private EntityManager em;//Se declaro "em",una variable de tipo EntityManager
    // EntityManager es utilizada para la persistencia de aplicaciones en Java.

  	public EntityManager getEntityManager() {//Se crea un método que consigue una instancia del EntityManager
  	    EntityManagerFactory emf = Persistence.createEntityManagerFactory("ABCPU");//Se obtiene  una instancia del Entity manager,indicando también el nombre de la PU
  	    EntityManager em=emf.createEntityManager(); //Se crea el el EntityManager y se inicia la interacción con la BD
  	    return em;
  	}
    //Ingresa a la tabla de inscripciones un registro nuevo
    public void create(Inscripcion inscripcion) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(inscripcion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
    //Obtiene de de la tabla, un registro con el ID que recibe
    public Inscripcion read(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Inscripcion.class, id);
        } finally {
            em.close();
        }
    }

    //actualiza el registro tomando el id de este
    public void update(Inscripcion inscripcion) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            inscripcion = em.merge(inscripcion);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = inscripcion.getIdInscripcion();
                if (read(id) == null) {
                    throw new NonexistentEntityException("The inscripcion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
    //borra el registro de la tabla
    public void delete(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Inscripcion inscripcion;
            try {
                inscripcion = em.getReference(Inscripcion.class, id);
                inscripcion.getIdInscripcion();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The inscripcion with id " + id + " no longer exists.", enfe);
            }
            em.remove(inscripcion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
    //es una consulta que regresa todos los registros en la tabla
    public List<Inscripcion> findInscripcionEntities() {
        return findInscripcionEntities(true, -1, -1);
    }

    //esta consulta se utiliza en la paginacion, ya que nos devuelve los registros dentro de un rango dado
   public List<Inscripcion> findInscripcionEntities(int maxResults, int firstResult) {
        return findInscripcionEntities(false, maxResults, firstResult);
    }

    
    //esta consulta es el motor de las dos anteriores
   private List<Inscripcion> findInscripcionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Inscripcion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    

    //es un contador nos devuelve el numero de registros que hay en la tabla
    public int getInscripcionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Inscripcion> rt = cq.from(Inscripcion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    /*Consulta que regresa todos los datos de inscripciones*/
    public List<Inscripcion>busca(int cuenta)
        { 
            em = getEntityManager();
            Query  q = em.createNamedQuery("Inscripcion.findByNoCuenta",Inscripcion.class);
            q.setParameter("noCuenta",cuenta);
            return q.getResultList();
        }
        /*Recibe parametros de cuenta y asignatura
        consulta la tabla Inscripcion de la base de datos
        si el alumno ya ha inscrito la materia regresa el id de la inscripcion hecha
        si no se encuentra regresa un -1 */
    public int validaInscripcion (int cuenta, int asignatura )
        {
            try {
            em = getEntityManager();
            Query q = em.createQuery ("SELECT p FROM Inscripcion p WHERE p.idAsignatura= ?1 AND p.noCuenta= ?2",Inscripcion.class);/*+" AND p.noCuenta= "+308108886);*/
            q.setParameter(1, asignatura);
            q.setParameter(2, cuenta);
            List<Inscripcion> lista = q.getResultList();
            if(lista==null)
                return -1;
            if(lista.size() == 0)
                return -1;
            Inscripcion ins=lista.get(0);
            return (int)ins.getIdInscripcion();
            } finally {
            em.close();

            }
        }
}

